﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using System.Threading;
using Control;

namespace Vista
{
    public partial class CargaInicial : Form
    {
        private Aplicacion aplicacion;
        private Aplicacion preAplicacion;
        private BackgroundWorker bw_Estaciones, bw_Lineas, bw_LineaArcos, bw_LineaStop, bw_Arcos, bw_Instanciacion, bw_Frecuencia;
        private string camino;
        private VentanaPrincipal _vp;

        public CargaInicial(VentanaPrincipal vp, Aplicacion ap)
        {
            InitializeComponent();
            _vp = vp;
            aplicacion = ap;
            preAplicacion = ap;

            bw_Arcos = new BackgroundWorker();
            bw_Arcos.WorkerSupportsCancellation = true;
            bw_Arcos.WorkerReportsProgress = true;
            bw_Arcos.DoWork += new DoWorkEventHandler(aplicacion.bw_DoWorkArcos);
            bw_Arcos.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChangedArcos);
            bw_Arcos.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompletedArco);

            bw_LineaStop = new BackgroundWorker();
            bw_LineaStop.WorkerSupportsCancellation = true;
            bw_LineaStop.WorkerReportsProgress = true;
            bw_LineaStop.DoWork += new DoWorkEventHandler(aplicacion.bw_DoWorkLineasStops);
            bw_LineaStop.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChangedLineaStop);
            bw_LineaStop.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompletedLineaStop);

            bw_LineaArcos = new BackgroundWorker();
            bw_LineaArcos.WorkerSupportsCancellation = true;
            bw_LineaArcos.WorkerReportsProgress = true;
            bw_LineaArcos.DoWork += new DoWorkEventHandler(aplicacion.bw_DoWorkLineaArcos);
            bw_LineaArcos.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChangedLineaArcos);
            bw_LineaArcos.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompletedLineaArco);

            bw_Lineas = new BackgroundWorker();
            bw_Lineas.WorkerSupportsCancellation = true;
            bw_Lineas.WorkerReportsProgress = true;
            bw_Lineas.DoWork += new DoWorkEventHandler(aplicacion.bw_DoWorkLineas);
            bw_Lineas.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChangedLineas);
            bw_Lineas.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompletedLinea);

            bw_Estaciones = new BackgroundWorker();
            bw_Estaciones.WorkerSupportsCancellation = true;
            bw_Estaciones.WorkerReportsProgress = true;
            bw_Estaciones.DoWork += new DoWorkEventHandler(aplicacion.bw_DoWorkEstaciones);
            bw_Estaciones.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChangedEstaciones);
            bw_Estaciones.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompletedEstaciones);

            bw_Instanciacion = new BackgroundWorker();
            bw_Instanciacion.WorkerSupportsCancellation = true;
            bw_Instanciacion.WorkerReportsProgress = false; ;
            bw_Instanciacion.DoWork += new DoWorkEventHandler(aplicacion.bw_DoWorkInstanciacion);
            bw_Instanciacion.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompletedInstanciacion);

            bw_Frecuencia = new BackgroundWorker();
            bw_Frecuencia.WorkerSupportsCancellation = true;
            bw_Frecuencia.WorkerReportsProgress = true;
            bw_Frecuencia.DoWork += new DoWorkEventHandler(aplicacion.bw_DoWorkFrecuenciaBuses);
            bw_Frecuencia.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChangedFrecuencia);
            bw_Frecuencia.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompletedFrecuencia);
        }

        private Boolean verificarCampos()
        {
            bool salida = false;
            if (!tBcapacidad.Text.Trim().Equals(""))
            {
                int flag;
                if (int.TryParse(tBcapacidad.Text,out flag))
                {
                    if (flag > 0)
                    {
                        salida = true;
                    }
                }
            }
            if (!txtPasajeros.Text.Trim().Equals(""))
            {
                int flag;
                if (int.TryParse(txtPasajeros.Text, out flag))
                {
                    if (flag > 0)
                    {
                        salida = true;
                    }
                }
            }
            return salida;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (verificarCampos())
            {
                buscarFolder.ShowDialog();

                camino = buscarFolder.SelectedPath;
                aplicacion.setCamino(camino);
                aplicacion.setParametrosCarga(int.Parse(tBcapacidad.Text),comboBDia.SelectedIndex, int.Parse(txtPasajeros.Text), int.Parse(txtCapacidadBus.Text), int.Parse(txtSobreCupo.Text));
                barraProgreso.Minimum = 0;
                barraProgreso.Maximum = 600;
                pgArco.Minimum = 0;
                pgArco.Maximum = 100;
                pgLineaArcos.Minimum = 0;
                pgLineaArcos.Maximum = 100;
                pgLineas.Minimum = 0;
                pgLineas.Maximum = 100;
                pgLineaStop.Minimum = 0;
                pgLineaStop.Maximum = 100;
                pgParadas.Minimum = 0;
                pgParadas.Maximum = 100;
                pgFrecuenciaBuses.Minimum = 0;
                pgFrecuenciaBuses.Maximum = 100;

                if (!camino.Equals(string.Empty) && camino != null)
                {
                    // analizar si existen los archivos

                    if (File.Exists(camino + "//FRECUENCIA.txt") && File.Exists(camino + "//ARCS.txt") && File.Exists(camino + "//STOPS.txt") && File.Exists(camino + "//LINES.txt") && File.Exists(camino + "//LINESTOPS.txt") && File.Exists(camino + "//LINESARCS.txt"))
                    {

                        if (bw_Estaciones.IsBusy != true)
                        {
                            bw_Estaciones.RunWorkerAsync();
                            button1.Enabled = false;
                            txtPasajeros.Enabled = false;
                            tBcapacidad.Enabled = false;
                            comboBDia.Enabled = false;
                            txtSobreCupo.Enabled = false;
                            txtCapacidadBus.Enabled = false;
                            aplicacion = preAplicacion; // en el caso en que la primera vez se interrumpa la carga de datos, 
                            //la segunda vez que se ejecute este metodo, la aplicacion este vacia.
                        }
                    }
                    else
                    {
                        MessageBox.Show("Faltan archivos.");
                    }
                }
            }
            else
            {
                MessageBox.Show("Los campos no son validos.");
            }
        }

        private void bw_ProgressChangedFrecuencia(object sender, ProgressChangedEventArgs e)
        {
            int porcentaje = int.Parse(e.ProgressPercentage.ToString());
            pgFrecuenciaBuses.Value = porcentaje * 100;
            pgFrecuenciaBuses.Update();
            actualizarBarras();
        }

        private void bw_ProgressChangedEstaciones(object sender, ProgressChangedEventArgs e)
        {                        
            int porcentaje = int.Parse(e.ProgressPercentage.ToString());
            pgParadas.Value = porcentaje*100;
            pgParadas.Update();
            actualizarBarras();               
        }

        private void bw_ProgressChangedLineas(object sender, ProgressChangedEventArgs e)
        {
            int porcentaje = int.Parse(e.ProgressPercentage.ToString());
            pgLineas.Value = porcentaje * 100;
            pgLineas.Update();
            actualizarBarras();
        }

        private void bw_ProgressChangedLineaArcos(object sender, ProgressChangedEventArgs e)
        {
            int porcentaje = int.Parse(e.ProgressPercentage.ToString());
            pgLineaArcos.Value = porcentaje;
            pgLineaArcos.Update();
            actualizarBarras();
        }

        private void bw_ProgressChangedLineaStop(object sender, ProgressChangedEventArgs e)
        {
            int porcentaje = int.Parse(e.ProgressPercentage.ToString());
            pgLineaStop.Value = porcentaje * 100;
            pgLineaStop.Update();
            actualizarBarras();
        }

        private void bw_ProgressChangedArcos(object sender, ProgressChangedEventArgs e)
        {
            int porcentaje = int.Parse(e.ProgressPercentage.ToString());
            pgArco.Value = porcentaje;
            pgArco.Update();
            actualizarBarras();
        }

        private void actualizarBarras()
        {
            barraProgreso.Value = pgArco.Value + pgLineaArcos.Value + pgLineas.Value + pgLineaStop.Value + pgParadas.Value + pgFrecuenciaBuses.Value;

            if (pgFrecuenciaBuses.Value == 100)
            {
                chFrecuenciaBuses.Checked = true;
            }
            if (pgParadas.Value == 100)
            {
                chParada.Checked = true;
            }
            if (pgLineas.Value == 100)
            {
                chLinea.Checked = true;
            }
            if (pgLineaArcos.Value == 100)
            {
                chLineaArco.Checked = true;
            }
            if (pgArco.Value == 100)
            {
                chArco.Checked = true;
            }
            if (pgLineaStop.Value == 100)
            {
                chLineaStop.Checked = true;
            }
        }

        private void bw_RunWorkerCompletedFrecuencia(object sender, RunWorkerCompletedEventArgs e)
        {
            _vp.cargaDatosExitosa();
            Thread.Sleep(1000);
            this.Close();
        }

        private void bw_RunWorkerCompletedEstaciones(object sender, RunWorkerCompletedEventArgs e)
        {
            if ((e.Cancelled == true))
            {
                MessageBox.Show("Cancelado por el usuario");
            }

            else if (!(e.Error == null))
            {
                MessageBox.Show("Error: " + e.Error.Message);
            }

            else
            {
                if (bw_Lineas.IsBusy != true)
                {
                    bw_Lineas.RunWorkerAsync();
                }  
            }
        }

        private void bw_RunWorkerCompletedArco(object sender, RunWorkerCompletedEventArgs e)
        {
            if ((e.Cancelled == true))
            {
                MessageBox.Show("Cancelado por el usuario");
            }

            else if (!(e.Error == null))
            {
                MessageBox.Show("Error: " + e.Error.Message);
            }

            else
            {                
                if (bw_Instanciacion.IsBusy != true)
                {
                    bw_Instanciacion.RunWorkerAsync();
                }
                MessageBox.Show("Carga completa, Organizando Datos");
            }
        }

        private void bw_RunWorkerCompletedLineaArco(object sender, RunWorkerCompletedEventArgs e)
        {
            if ((e.Cancelled == true))
            {
                MessageBox.Show("Cancelado por el usuario");
            }

            else if (!(e.Error == null))
            {
                MessageBox.Show("Error: " + e.Error.Message);
            }

            else
            {
                if (bw_Arcos.IsBusy != true)
                {
                    bw_Arcos.RunWorkerAsync();
                } 
            }
        }

        private void bw_RunWorkerCompletedLineaStop(object sender, RunWorkerCompletedEventArgs e)
        {
            if ((e.Cancelled == true))
            {
                MessageBox.Show("Cancelado por el usuario");
            }

            else if (!(e.Error == null))
            {
                MessageBox.Show("Error: " + e.Error.Message);
            }

            else
            {                
                    bw_LineaArcos.RunWorkerAsync();                    
            }
        }

        private void bw_RunWorkerCompletedLinea(object sender, RunWorkerCompletedEventArgs e)
        {
            if ((e.Cancelled == true))
            {
                MessageBox.Show("Cancelado por el usuario");
            }
               
            else if (!(e.Error == null))
            {
                MessageBox.Show("Error: " + e.Error.Message);
            }

            else
            {
                bw_LineaStop.RunWorkerAsync();                
            }
        }

        private void bw_RunWorkerCompletedInstanciacion(object sender, RunWorkerCompletedEventArgs e)
        {
            if (bw_Frecuencia.IsBusy != true)
            {
                bw_Frecuencia.RunWorkerAsync();
            }            
        }

        private void CargaInicial_Closing(object sender, EventArgs e)
        {
            if (bw_Arcos.IsBusy)
            {
                bw_Arcos.CancelAsync();
            }

            if (bw_Estaciones.IsBusy)
            {
                bw_Estaciones.CancelAsync();
            }

            if (bw_LineaArcos.IsBusy)
            {
                bw_LineaArcos.CancelAsync();
            }

            if (bw_Lineas.IsBusy)
            {
                bw_Lineas.CancelAsync();
            }

            if (bw_LineaStop.IsBusy)
            {
                bw_LineaStop.CancelAsync();
            }
            button1.Enabled = true;
            txtPasajeros.Enabled = true;
            tBcapacidad.Enabled = true;
            comboBDia.Enabled = true;
            txtCapacidadBus.Enabled = true;
            txtSobreCupo.Enabled = true;
        }        

        private void CargaInicial_Load(object sender, EventArgs e)
        {
            comboBDia.SelectedIndex = 0;
        }

    }
}
